package com.zjitc.p2.obj;

import com.zjitc.p2.obj.M;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Create by IntelliJ IDEA
 *
 * @author: jsonor
 * @date-Time: 2018/3/13 14:47
 * @description:
 */
//动态代理,反射
public class AProxy implements InvocationHandler {
    /** 被代理对象 -- A */
    private M target;

    public AProxy(M target) {
        this.target = target;
    }

    // Proxy.newProxyInstance() 返回一个代理对象
    // every time 这个代理对象待用这个接口的任意方法时，都会调用invoke方法
    public Object getProxy() {
        Class clazz = this.target.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    }

    // method: 被调用方法的信息
    // args: 参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getName() == "a") {
            System.out.println("init");
            method.invoke(target, args);
            System.out.println("destroy");
        } else {
            method.invoke(target, args);
        }

        return null;
    }
}
